package com.vogue.supplymall.payment.tools;

import org.apache.commons.codec.binary.Base64;
import java.util.UUID;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/**
 * AES加密
 * 
 * @author 崔岳
 *
 */
public class AESUtil {

	public static final String keymodel = "AES";
	public static final String logalrithm = "AES/ECB/PKCS5Padding";// 算法/工作模式/填充模式
	public static final String bm = "utf-8";

	/**
	 * 获取加密16位随机字符串
	 * 
	 * @param cKey
	 */
	public static String getRandomkey() {
		UUID uuid = UUID.randomUUID();
		String str = uuid.toString();
		String temp = str.substring(0, 8) + str.substring(9, 13) + str.substring(14, 18) + str.substring(19, 23)
				+ str.substring(24); 
		return temp.substring(0, 16);
	}
    
	/**
	 * 获取Base64编码后的16位随机字符串
	 * @return
	 */
	public static String getRandomkey64() {
		return encode64(getRandomkey());
	}
	
	/**
	 * 将所传入的字符串进行Base64编码
	 * @param content 需要编码的内容
	 * @return
	 */
	public static String encode64(String content) {
		return Base64.encodeBase64String(content.getBytes());
	}
	
	
    public static SecretKey readKey(String key64) throws Exception {  
        //读取存起来的密钥  
        SecretKeySpec keySpec = new SecretKeySpec(Base64.decodeBase64(key64.getBytes()), keymodel);  
        return keySpec;  
    }  
 
    /**
     * AES加密
     * 
     * @param key64	加密16位随机串Base64编码后的值
     * @param content 需要加密的字符串
     * @return String 加密以后的内容Base64编码后的字符串
     * @throws Exception
     */
    public static String encrypt(String key64, String content) throws Exception {  
        //1、指定算法、获取Cipher对象  
        Cipher cipher = Cipher.getInstance(logalrithm);//算法是AES  
        //2、生成/读取用于加解密的密钥  
        SecretKey secretKey = readKey(key64);  
        //3、用指定的密钥初始化Cipher对象，指定是加密模式，还是解密模式  
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);  
//        String content = "Hello AES";//需要加密的内容  
        //4、更新需要加密的内容  
//       cipher.update(content.getBytes());  
        //5、进行最终的加解密操作  
        byte[] result = cipher.doFinal(content.getBytes());//加密后的字节数组  
        //也可以把4、5步组合到一起，但是如果保留了4步，同时又是如下这样使用的话，加密的内容将是之前update传递的内容和doFinal传递的内容的和。  
//      byte[] result = cipher.doFinal(content.getBytes());  
        String base64Result = Base64.encodeBase64String(result);//对加密后的字节数组进行Base64编码  
//        System.out.println("Result: " + base64Result);  
        return base64Result;
    }  
      
    /**
     * AES解密 
     *  
     * @param key64 加密16位随机串Base64编码后的值
     * @param contentBase64 需要解密的Base64编码后的字符串
     * @return String 解密后的原文字符串
     * @throws Exception
     */
    public static String decrpyt(String key64, String contentBase64) throws Exception {  
        Cipher cipher = Cipher.getInstance(logalrithm);  
        SecretKey secretKey = readKey(key64);  
        cipher.init(Cipher.DECRYPT_MODE, secretKey);  
        byte[] encodedBytes = Base64.decodeBase64(contentBase64.getBytes());
        byte[] result = cipher.doFinal(encodedBytes);//对加密后的字节数组进行解密  
//        System.out.println("Result: " + new String(result)); 
        return new String(result);
    }  

}
